/*
 * 基于muduo网络库实现的TCP翻译服务器
 * 功能：接收客户端字符串，根据内置词典返回翻译结果
 */

// 包含必要的头文件
#include "include/muduo/net/TcpServer.h"   // muduo TCP服务器核心组件
#include "include/muduo/net/EventLoop.h"   // 事件循环核心组件
#include "include/muduo/net/TcpConnection.h" // TCP连接相关组件
#include <iostream>
#include <functional>  // 用于std::bind绑定回调函数
#include <unordered_map>


// 翻译服务器类
class TranslateServer 
{
public:
    // 构造函数：初始化服务器配置
    // 参数：port-监听端口号
    TranslateServer(int port) : 
        _baseloop(),  // 初始化事件循环对象
        _server(&_baseloop,  // 将事件循环绑定到TcpServer
            muduo::net::InetAddress("0.0.0.0", port), // 监听所有网卡的指定端口
            "TranslateServer",  // 服务器名称（用于日志标识）
            muduo::net::TcpServer::kReusePort)  // 启用端口复用选项
    {
        std::cout << "构造函数开始" << std::endl;

        // 设置连接建立/关闭回调函数
        // 使用std::bind将成员函数绑定为回调，placeholders::_1表示参数占位符
        _server.setConnectionCallback(
            std::bind(&TranslateServer::onConnection, this, std::placeholders::_1));
        
        // 设置消息到达回调函数
        _server.setMessageCallback(
            std::bind(&TranslateServer::onMessage, this, std::placeholders::_1,
                std::placeholders::_2, std::placeholders::_3));

        std::cout << "构造函数结束" << std::endl;
    }

    // 启动服务器（开始事件循环）
    void start() 
    {
        std::cout << "start() 调用" << std::endl;
        _server.start();  // 启动TcpServer（开始监听端口）
        _baseloop.loop(); // 进入事件循环（阻塞调用，开始处理网络事件）
    }

private:
    // 连接状态变化回调函数
    // 参数：conn-TCP连接智能指针
    void onConnection(const muduo::net::TcpConnectionPtr& conn) 
    {
        // 判断连接状态并输出日志
        if (conn->connected()) 
        {
            std::cout << "新客户端连接: " 
                      << conn->peerAddress().toIpPort() << " -> "
                      << conn->localAddress().toIpPort() 
                      << " 状态: 已连接" << std::endl;
        } 
        else 
        {
            std::cout << "客户端断开: " 
                      << conn->peerAddress().toIpPort()
                      << " 状态: 已关闭" << std::endl;
        }
    }

    // 翻译功能实现
    // 参数：str-待翻译字符串
    // 返回值：翻译结果字符串
    std::string translate(const std::string &str) {
        // 静态字典，存储中英互译词库
        static std::unordered_map<std::string, std::string> dict_map = {
            {"hello", "你好"},
            {"Hello", "你好"},    // 支持不同大小写
            {"你好", "Hello"},
            {"吃了吗", "油泼面"}  // 趣味翻译示例
        };

        auto it = dict_map.find(str);
        if (it == dict_map.end()) {
            return "未找到翻译";  // 未找到对应翻译时的默认返回
        }
        return it->second;
    }

    // 消息处理回调函数
    // 参数：
    //   conn - TCP连接对象智能指针
    //   buf  - 接收缓冲区（包含客户端发送的数据）
    //   time - 消息到达时间戳（此处未使用）
    void onMessage(const muduo::net::TcpConnectionPtr& conn, 
                   muduo::net::Buffer* buf, 
                   muduo::Timestamp) 
    {
        // 1. 从缓冲区提取全部数据（自动清空缓冲区）
        std::string recv_str = buf->retrieveAllAsString();
        std::cout << "收到消息: " << recv_str << std::endl;

        // 2. 调用翻译函数处理
        std::string resp_str = translate(recv_str);

        // 3. 将响应发送回客户端
        conn->send(resp_str);
        std::cout << "发送响应: " << resp_str << std::endl;
    }

private:
    muduo::net::EventLoop _baseloop;  // 事件循环对象（一个线程一个EventLoop）
    muduo::net::TcpServer _server;    // TCP服务器对象（管理连接和监听）
};

int main()
{
    // 创建翻译服务器实例，监听8888端口
    TranslateServer server(8888);
    
    // 输出服务器启动信息
    std::cout << "翻译服务器启动，监听端口 8888..." << std::endl;
    
    // 启动服务器（进入事件循环）
    server.start();
    
    return 0;
}